part of "../basic.dart";

/// 将各种变量类型转换为可以写入到文件中的String
String stringify(dynamic variable) {
  // 如果json化后是一个字符串，则直接返回json化的东西（因为此处不能Encode，会多2个双引号）
  if (jsonfy(variable) is String) return jsonfy(variable);
  // 否则返回json化后的内容
  return jsonEncode(jsonfy(variable));
}

/// 将各种变量类型转换为JsonMap、RawList或者Primitive等可以直接转换为json的格式
dynamic jsonfy(dynamic variable) {
  late final dynamic result;

  if (isPrimitive(variable)) {
    // 如果变量是原始值，那么它本身就可以json化
    result = variable;
  } else if (variable is Jsonable) {
    // 如果变量是Rawable，它的zip形式就是json化
    return variable.toJson();
  } else if (variable is Map) {
    result = {};
    // 如果变量是一个Map，那么检查它的每个key和value都json化，然后返回一个新的Map
    for (MapEntry entry in variable.entries) {
      result[jsonfy(entry.key)] = jsonfy(entry.value);
    }
  } else if (variable is Iterable) {
    result = [];
    // 如果变量是一个List，那么将它的每一项都json化后返回
    for (final item in variable) {
      result.add(jsonfy(item));
    }
  } else if (variable == null) {
    return null;
  } else if (variable is Date || variable is DateTime) {
    return variable.toString();
  } else if (variable is Exception || variable is Bug) {
    return variable.toString();
  } else {
    throw BugDev(
        "数据类型[${variable.runtimeType}]尚未在jsonfy中注册，有可能它是递归引用后的项目，请仔细检查");
  }

  assert(result is List || result is Map || isPrimitive(result));
  return result;
}
